package com.example.demo.common;

import com.example.demo.entity.Userinfo;
import com.example.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.DigestUtils;
import org.springframework.util.StringUtils;

import java.util.UUID;

/**
 * Created with IntelliJ IDEA.
 * Description: 加盐加密的工具类
 */
public class PasswordUtil {

    /**
     * 加盐并生成密码
     * @param password 明文密码
    * @return 数据库中保存的密码
     */
    public static String encrypt(String password) {
        // 1. 获取盐值
        String salt = UUID.randomUUID().toString().replace("-", "");
        // 2. 生成加盐之后的密码
        String saltPassword = DigestUtils.md5DigestAsHex((salt + password).getBytes());
        // 3. 生成最终密码【约定格式：盐值 + # + 加盐后的密码】
        String finalPassword = salt + "#" + saltPassword;
        return finalPassword;
    }

    /**
     * 加盐生成密码（方法1的重载，为解密提供方法）
     * @param password 明文
     * @param salt 固定的盐值
     * @return 加盐后需要进行比对的密码
     */
    public static String encrypt(String password, String salt) {
        // 1. 生成加盐后的密码
        String saltPassword = DigestUtils.md5DigestAsHex((salt + password).getBytes());
        // 2. 生成最终密码【约定格式：盐值 + # + 加盐后的密码】
        // $ 是正则表达式的特殊字符，如果要使用就需要转义
        String finalPassword = salt + "#" + saltPassword;
        return finalPassword;
    }

    /**
     * 验证密码
     * @param inputPassword 用户数据的明文密码
     * @param finalPassword 数据库保存的最终密码
     * @return 密码比对结果
     */
    public static boolean decrypt(String inputPassword, String finalPassword) {
        if(StringUtils.hasLength(inputPassword) && StringUtils.hasLength(finalPassword) &&
                finalPassword.length() == 65) {
            // 1. 得到盐值
            String uuid = finalPassword.split("#")[0];
            // 2. 得到用户密码的 finalPassword
            String userPassword = PasswordUtil.encrypt(inputPassword, uuid);
            // 3. 对比判断
            return userPassword.equals(finalPassword);
        }
        return false;
    }

    public static void main(String[] args) {
        String password = "admin";
        String inputPassword1 = "123456";
        String inputPassword2 = "1234567";
        String finalPassword = encrypt(password);
        System.out.println("加密：" + finalPassword);
        System.out.println("结果1：" + decrypt(inputPassword1, finalPassword));
        System.out.println("结果2：" + decrypt(inputPassword2, finalPassword));
    }
}
